package com.gzyz.cheetah.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.gzyz.cheetah.entity.dto.DocumentDTO;
import com.gzyz.cheetah.entity.dto.PageDTO;
import com.gzyz.cheetah.entity.pagerequest.DocumentPageRequest;
import com.gzyz.cheetah.entity.table.Document;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * <p>
 * 文档 服务类
 * </p>
 *
 * @author xclhove
 * @since 2023-11-06
 */
public interface IDocumentService extends IService<Document> {
    /**
     * 上传文档
     *
     * @param userId         用户id
     * @param uploadDocument 要上传的文档
     * @return 文档信息
     */
    public Document uploadDocument(Integer userId, MultipartFile uploadDocument);
    
    /**
     * 通过文档id删除文档
     *
     * @param userId     用户id
     * @param documentId 文档id
     * @return 是否删除成功
     */
    public boolean deleteDocumentById(Integer userId, Integer documentId);
    
    /**
     * 通过文档id批量删除文档
     * @param userId 用户id
     * @param documentIds 文档id
     * @return 是否删除成功
     */
    public boolean deleteDocumentsByIds(Integer userId, List<Integer> documentIds);
    
    /**
     * 更新文档
     *
     * @param document 文档信息
     * @return 是否更新成功
     */
    public boolean updateDocument(Document document);
    
    /**
     * 通过文档id获取一篇文档
     *
     * @param userId     用户id
     * @param documentId 文档id
     * @return 文档信息
     */
    public Document getOneDocumentById(Integer userId, Integer documentId);
    
    /**
     * 分页获取用户文档(仅公共)
     *
     * @param userId     用户id
     * @param pageRequest 分页请求信息
     * @return 文档分页数据(仅公共)
     */
    public PageDTO<Document> pageUserDocuments(Integer userId, DocumentPageRequest pageRequest);
    
    /**
     * 分页获取用户文档(所有)
     *
     * @param userId      用户id
     * @param pageRequest 分页请求信息
     * @param showPrivate 是否展示私有文档
     * @return 文档分页数据(所有)
     */
    public PageDTO<Document> pageUserDocuments(Integer userId, DocumentPageRequest pageRequest, boolean showPrivate);
    
    /**
     * 通过文档id冻结文档
     *
     * @param documentId 文档id
     * @return 是否冻结成功
     */
    public boolean freezeDocumentById(Integer documentId);
    
    /**
     * 通过文档id解冻文档
     *
     * @param documentId 文档id
     * @return 是否解冻成功
     */
    public boolean unFreezeDocumentById(Integer documentId);
    
    /**
     * 通过用户id批量冻结用户的文档
     *
     * @param userId 用户id
     * @return 是否冻结成功
     */
    public boolean freezeUserDocuments(Integer userId);
    
    /**
     * 通过用户id批量解冻用户的文档
     *
     * @param userId 用户id
     * @return 是否解冻成功
     */
    public boolean unFreezeUserDocuments(Integer userId);
    
    /**
     * 下载文档
     *
     * @param response       响应
     * @param downloadUserId 下载文件用户的id
     * @param documentId     文档id
     */
    public void download(HttpServletResponse response, Integer downloadUserId, Integer documentId);
    
    /**
     * 分页搜索文档(仅公共)
     *
     * @param pageRequest 分页请求
     * @return 文档分页数据(仅公共)
     */
    PageDTO<DocumentDTO> searchDocuments(DocumentPageRequest pageRequest);
    
    /**
     * 分页搜索所有文档
     * @param searchTitle 搜索标题
     * @param pageNumber 页码
     * @param pageSize 每页数量
     * @return 分页数据
     */
    PageDTO<Document> pageDocuments(String searchTitle, Integer pageNumber, Integer pageSize);
    
    /**
     * 修改文档评论区状态
     * @param documentId 文档id
     */
    void changeCommentStatus(Integer documentId);
}
